// ArrayBuffer：对固定长度的连续内存空间的引用

// 1. 新建
let buffer = new ArrayBuffer(8); // 创建一个长度为 8 的 buffer
console.log(buffer.byteLength); // 8，分配一个 8 字节的连续内存空间，并有0进行预填充

// ArrayBuffer 无法感知，只是一个原始的字节序列
// 若想操作 buffer 中的数据，需要使用 “视图” 对象
// 视图对象只是工具，不存储任何东西
// 有如下视图：
// - Unit8Array: 将 ArrayBuffer 视为字节序列，每个字节存储一个 0~255 的数字（即8位），称为“8位无符号整数”
// - Unit16Array:  将 ArrayBuffer 视为字节序列，每两个字节存储一个 0~65535 的数字（即16位），称为“16位无符号整数”
// - Unit32Array: 将 ArrayBuffer 视为字节序列，每四个字节存储一个 0~4294967295 的数字（即32位），称为“32位无符号整数”
// - Float64Array:  将 ArrayBuffer 视为字节序列，每八个字节存储一个 64 位（即双精度）浮点数

buffer = new ArrayBuffer(16)

let view = new Uint32Array(buffer)
console.log(Uint32Array.BYTES_PER_ELEMENT); // 每个整数 4 个字节
console.log(view.length); // 4，因为 buffer 的长度是 16 字节，每个元素占 4 个字节
console.log(view.byteLength) // 16 字节的大小

view[0] = 1234567890

console.log(view); [1234567890, 0, 0, 0]

// 所有视图的通用术语是 TypedArray，即类型化数组
let array64 = new BigUint64Array(buffer)
console.log(array64.length);
console.log(array64.byteLength);

let num = 1000
console.log(num.toString(2));
// byteLength 指向的是 ArrayBuffer 的字节长度，不会随视图（Uint8/Uint16...）变化

{
  let array = [1, 1000]
  let uint16Array = new Uint16Array(array)
  // let arrayBuffer = uint16Array.buffer
  console.log(uint16Array);
  let uint8Array = new Uint8Array(array)
  console.log(uint8Array);

  let num = 255
  console.log(num.toString(2));
  // Uint8Array 采用 1字节（8位）来存储，无符号的8位整数最大值是 11111111 = 255
  // 1000  的二进制是 1111101000，需要两个字节存储，所以会截取后面 8 位 = 11101000
  num = 0b11101000
  console.log(num) // 232，所以 1000 用 uint8Array 表示为 232
}